#定义 数据库工具类
import pymysql


class DBTools:
    #1、定义创建连接的方法-类方法：类方法调用时，直接类名.方法名即可。这样就不用创建对象了
    # 创建连接的这个方法，对用户没有什么用，它只需要调用后面的两个方法即可，所以这个方法可以设置成私有方法
    # 私有方法，在同一个类内部是可以调用的，在类外部不可用
    # 设置私有方法，在方法名前加 __

    @classmethod
    def __create_conn(cls):
        conn = pymysql.connect(host="192.168.118.143",port=3306,user="root",passwd="iTest_2022_mysql",
                           database="ihrm",charset="utf8")
        # 创建好连接之后，这个连接后面调用的过程中，要拿conn去创建游标，所以需要一个返回值，不然拿不到conn
        return conn

    #2、定义 使用游标 执行SQL语句的方法
     # 查寻一条记录
    @classmethod
    def query_one(cls,sql):
        conn = None
        my_cursor = None
        res = None
        try:
            # 1、调用类方法,创建连接
            conn = DBTools.__create_conn()
            # 2、创建游标
            my_cursor = conn.cursor()
            # 执行 SQL 语句，做查询
            my_cursor.execute(sql)
            # 使用 游标 提取结果集中的 一条记录
            res = my_cursor.fetchone()
        except Exception as err:
            print("执行查询sql 语句失败：",str(err))
        finally:
            # 3、关闭游标
            my_cursor.close()
            # 4、关闭连接
            conn.close()
            # 返回查询出的结果,如果没有结果，返回定义的初始值即可 。
            # 代码遇到return，就不能再执行后面的代码了
            return res


     # 增删改记录   定义类方法
    @classmethod
    def db_idu(cls,sql):
        conn = None
        my_cursor = None
        try:
            # 1创建连接 ,调用创建连接的方法，并用conn 接收返回值
            conn = DBTools.__create_conn()
            # 2创建游标
            my_cursor = conn.cursor()
            # 3执行 增、删、改的 sql 语句
            my_cursor.execute(sql)
            # 执行成功，提交事务，这是数据库的事，所以用conn
            conn.commit()
        except Exception as err:
            print("执行增、删、改sql 语句失败：",str(err))
            # 执行失败，回滚事务
            conn.rollback()
        finally:
            # 4关闭游标
            my_cursor.close()
            # 5关闭来连接
            conn.close()
            # 增删改数据库成功后，如果想看影响了几行，可以用以下代码,用连接去调用
            print("Affected_rows:",conn.affected_rows())





if __name__ == '__main__':
    # query_one()方法有返回值，所以需要将其打印出来
    result1 = DBTools.query_one("select * from t_book;")
    print("查询语句的结果：",result1)
    # 调用db_idu()方法，没有返回值，所以只需要将需要的参数传进去即可
    DBTools.db_idu("insert into t_book(id,title) values(8,'永夜星河')")




